#include "Dog.h"
#include "Resource.h"


Dog::Dog(LPDIRECT3DDEVICE9 d3ddv,  LPDIRECT3DSURFACE9 BackBuffer, LPD3DXSPRITE SpriteHandler, float x, float y, int ID, int Object_State, int Direction): Object(x, y)//, ID, Object_State)
{
	this->setIDObjType(ID);	

	is_turn_left = false;

	pos_x = x;
	pos_y = y;

	 
	pos_x_old = x;
	pos_y_old = y;
	
	veloc_x = 0;
	veloc_y = 0;
	accel_y = 0;

	p_sprite = new Sprite(SpriteHandler, ResourceMng::GetInst(d3ddv, BackBuffer)->GetTexture(ResourceMng::GetInst(d3ddv, BackBuffer)->getMapTexture()[16]->getFileName()), 125, 0);
	p_light = new Sprite(SpriteHandler, ResourceMng::GetInst(d3ddv, BackBuffer)->GetTexture(ResourceMng::GetInst(d3ddv, BackBuffer)->getMapTexture()[7]->getFileName()), 125, 0);

	width = p_sprite->getTexture()->getWidth();
	height = p_sprite->getTexture()->getHeight();

	timeDie = 0;

	

	is_gravity = true;

	
	this->obj_state = Object_State;
	direction = Direction;
	
	if (obj_state == ES_NORMAL)
	{
		if (direction == 1)			//sang trai
		{
			//turnLeft();
			is_turn_left = true;
			p_sprite->setFrame(0,1);
			p_sprite->setIndex(0);
		} 
		else if (direction == 2)	//sang phai
		{
			//turnRight();
			is_turn_left = false;
			p_sprite->setFrame(4,5);
			p_sprite->setIndex(4);
		}
	} 
	else if (obj_state == ES_ACTIVING)
	{
		if (direction == 1)			//sang trai
		{
			turnLeft();			
			p_sprite->setIndex(0);
		} 
		else if (direction == 2)	//sang phai
		{
			turnRight();
			p_sprite->setIndex(4);
		}
	}
}

Dog::~Dog()
{
	/*if (_sprite != NULL)
	delete _sprite;*/
	
}

 

void Dog::render(int cameraX, int cameraY)
{
	
	if (obj_state != ES_REMOVE)
	{
		p_sprite->render(pos_x, pos_y, cameraX, cameraY);
	}
	
}

OBJECT_TYPE Dog::getObjectType()
{
	return OBJECT_ENEMY;
}

/**--------------------------------------------------------
*Description : Turn left Turtle
*Method name : TurnLeft
*Parameters :   
*Return value : void
--------------------------------------------------------**/
void Dog :: turnLeft()
{
	is_turn_left = true;
	p_sprite->setFrame(1, 4);
	veloc_x = (float)-DOG_VX;
}


/**--------------------------------------------------------
*Description : Turn right Turtle
*Method name : TurnRight
*Parameters :   
*Return value : void
--------------------------------------------------------**/
void Dog :: turnRight()
{
	is_turn_left = false;
	p_sprite->setFrame(5, 8);
	veloc_x = (float)DOG_VX;
}

void Dog::update(list<Object*>* obj_list, DxInput* input, float gameTime)
{
	switch (obj_state)
	{
	case ES_ACTIVING:
		move(obj_list, gameTime);//Move(staObjs, gameTime);
		
		if (pos_y <= 0)	//goomba roi xuong ho, height = 0
		{
			changeState(ES_REMOVE);
		}
		
		break;
	case ES_DIED:
		timeDie += gameTime;
		if (timeDie > 900)
		{
			changeState(ES_REMOVE);
		}
		
		
		break;
	case ES_FALL:
		pos_x += veloc_x * gameTime;
		veloc_y -= accel_y * gameTime;
		pos_y += veloc_y * gameTime + 1/2 * accel_y * gameTime *gameTime;
		if (pos_y <= 0)	//goomba roi xuong ho, height = 0
		{
			changeState(ES_REMOVE);
		}
		
		break;
	}
	
	p_sprite->update(gameTime);
	
}

void Dog::update(list<Object*>* obj_list, DxInput* input, float gameTime, Object* simon)
{
	switch (obj_state)
	{
	case ES_NORMAL:
		{
			if (simon->getPosX() + 400 > this->pos_x) //tinh khoang cach de active dog  enemy
			{
				changeState(ES_ACTIVING);
			}
		}
		break;

	case ES_ACTIVING:
		move(obj_list, gameTime, simon);

		if (pos_y <= 0)	//goomba roi xuong ho, height = 0
		{
			changeState(ES_REMOVE);
		}
		break;

	case ES_DIED:
		timeDie += gameTime;
		if (timeDie > 900)
		{
			changeState(ES_REMOVE);
		}
		break;

	default:
		break;
	}

	p_sprite->update(gameTime);

}

void Dog::move(list<Object*>* obj_list, float TPF)
{
	Object* obj;
	list<Object*>::iterator i;
	width = p_sprite->getTexture()->getWidth();
	height = p_sprite->getTexture()->getHeight();
	
	pos_x_old = pos_x;
	pos_y_old = pos_y;

	pos_x_old = pos_x;
	pos_y_old = pos_y;
	

	//Xet va cham theo truc X
	pos_x += veloc_x * TPF;
	
	

	//Xet va cham theo truc Y
	if (is_gravity == false)
	{
		accel_y = 0;
	}
	else
	{
		accel_y = DOG_GRAVITY;
	}	
	veloc_y -= accel_y * TPF;
	pos_y += veloc_y * TPF + 1/2.0 * accel_y * TPF * TPF;
	//ResetRect();


	//kiem tra va cham nam tren gach, da
	for (i = obj_list->begin(); i != obj_list->end(); i++)
	{
		obj = *i;
		if (obj->getObjectType() == OBJECT_LAND)
		{
			//Box box = this->getBox(time);
			Box box(this->pos_x_old,
				this->pos_y_old - this->height, 
				width, 
				height, 
				veloc_x * TPF, 
				veloc_y * TPF + 1.0f/2.0f * accel_y * TPF * TPF);

			//Box block = obj->getBox(time);
			Box block(obj->getPosX(),
				obj->getPosY() - obj->getHeight(),// - 0.11,
				obj->getWidth(),
				obj->getHeight()
				);

			Box boxphase = Collision::GetSweptBroadphaseBox(box);
			if (Collision::AABBCheck(boxphase, block))
			{
				float normalx = 0;
				float normaly = 0;
				float collision_time = Collision::SweptAABB(box, block, normalx, normaly);
				if (0 < collision_time && collision_time < 1)
				{
					is_gravity = false;
					if (normalx == 1 && normaly == 0)		//va cham tu phai -> trai
					{
						//if (this->pos_y_old - this->height < obj->getPosY())
						//{
						//	pos_x = pos_x_old + veloc_x * collision_time;
						//	veloc_x = -veloc_x;						
						//}
					} 
					else if (normalx == -1 && normaly == 0)		//va cham tu trai -> phai
					{
						//if (this->pos_y_old - this->height < obj->getPosY())
						//{
						//	pos_x = pos_x_old + veloc_x * collision_time;
						//	veloc_x = -veloc_x;						
						//}
					}
					else if (normalx == 0 && normaly == -1)		//va cham tu duoi -> tren
					{
						
					}
					else if (normalx == 0 && normaly == 1)		//va cham tu tren -> duoi
					{
						pos_y = pos_y_old + veloc_y * collision_time + 1.0f/2.0f * accel_y * collision_time *collision_time;// + 0.5;
						accel_y = 0;
						veloc_y = 0;
					}

				}
				else
				{
					is_gravity = true;
				}
			}
			else
			{
				is_gravity = true;
				
			}
			 
		}
		else
		{
			is_gravity = true;
		}
	}

	if(veloc_x > 0)
	{
		turnRight();
	}
	else
	{
		turnLeft();
	}

	pos_x_old = pos_x;
	pos_y_old = pos_y;
		

	if (veloc_x >= 0)
	{
		direction = 2;
	} 
	else
	{
		direction = 1;
	}
}

void Dog::move(list<Object*>* obj_list, float TPF, Object* simon)
{
	Object* obj;
	list<Object*>::iterator i;
	width = p_sprite->getTexture()->getWidth();
	height = p_sprite->getTexture()->getHeight();
	
	pos_x_old = pos_x;
	pos_y_old = pos_y;

	

	//Xet va cham theo truc X
	pos_x += veloc_x * TPF;
	
	

	//Xet va cham theo truc Y
	if (is_gravity == false)
	{
		accel_y = 0;
	}
	else
	{
		accel_y = DOG_GRAVITY;
	}	
	veloc_y -= accel_y * TPF;
	pos_y += veloc_y * TPF + 1/2.0 * accel_y * TPF * TPF;
	


	//kiem tra va cham nam tren gach, da
	for (i = obj_list->begin(); i != obj_list->end(); i++)
	{
		obj = *i;
		if (obj->getObjectType() == OBJECT_LAND)
		{
			
			Box box(this->pos_x_old,
				this->pos_y_old - this->height, 
				width, 
				height, 
				veloc_x * TPF, 
				veloc_y * TPF + 1.0f/2.0f * accel_y * TPF * TPF);
			
			Box block(obj->getPosX(),
				obj->getPosY() - obj->getHeight(),
				obj->getWidth(),
				obj->getHeight());

			Box boxphase = Collision::GetSweptBroadphaseBox(box);
			if (Collision::AABBCheck(boxphase, block))
			{
				float normalx = 0;
				float normaly = 0;
				float collision_time = Collision::SweptAABB(box, block, normalx, normaly);
				if (0 < collision_time && collision_time < 1)
				{
					is_gravity = false;
					if (normalx == 1 && normaly == 0)		//va cham tu phai -> trai
					{
						/*if (this->pos_y_old - this->height < obj->getPosY())
						{
							pos_x = pos_x_old + veloc_x * collision_time;
							veloc_x = -veloc_x;						
						}*/
					} 
					else if (normalx == -1 && normaly == 0)		//va cham tu trai -> phai
					{
						/*if (this->pos_y_old - this->height < obj->getPosY())
						{
							pos_x = pos_x_old + veloc_x * collision_time;
							veloc_x = -veloc_x;						
						}*/
					}
					else if (normalx == 0 && normaly == -1)		//va cham tu duoi -> tren
					{
						
					}
					else if (normalx == 0 && normaly == 1)		//va cham tu tren -> duoi
					{
						pos_y = pos_y_old + veloc_y * collision_time + 1.0f/2.0f * accel_y * collision_time *collision_time;
						accel_y = 0;
						veloc_y = 0;
					}//end if
					 
				}
				else
				{
					is_gravity = true;
				}//end if
			}
			else
			{
				is_gravity = true;
			}//end if			 
		}
		else
		{
			is_gravity = true;
		}//end if
	}//end for



	//va cham voi simon
	//Box box(this->pos_x_old,
	//	this->pos_y_old - this->height, 
	//	width, 
	//	height, 
	//	veloc_x * TPF, 
	//	veloc_y * TPF + 1.0f/2.0f * accel_y * TPF * TPF);


	//Box block(simon->getPosX(),
	//	simon->getPosY() - simon->getHeight(),
	//	simon->getWidth() - (60 - 32),
	//	simon->getHeight()
	//	);

	//Box boxphase = Collision::GetSweptBroadphaseBox(box);
	//if (Collision::AABBCheck(boxphase, block))
	//{
	//	if (simon->getObjState() == MS_NORMAL)
	//	{
	//		int blood = simon->getBlood();
	//		blood--;
	//		simon->setBlood(blood);
	//		if (simon->getBlood() == 0)
	//		{
	//			simon->changeState(MS_DIE);		//simon die
	//		}
	//		else
	//		{
	//			simon->changeState(MS_BLOOD_LOOS);	//simon 
	//		}
	//	}
	//}

	if(veloc_x > 0)
	{
		turnRight();
	}
	else
	{
		turnLeft();
	}

	pos_x_old = pos_x;
	pos_y_old = pos_y;

	if (veloc_x >= 0)
	{
		direction = 2;
	} 
	else
	{
		direction = 1;
	}
}

void Dog::changeState(int state)
{
	obj_state = state;
	switch (obj_state)
	{
	case ES_ACTIVING:
		if (is_turn_left == true)
		{
			veloc_x = -DOG_VX;
		}
		else
		{
			veloc_x = DOG_VX;
		}
		veloc_x = -DOG_VX;
		accel_y = DOG_GRAVITY;
		break;

	case ES_DIED:
		p_sprite = p_light;
		veloc_x = 0;
		break;
	}
}
